class ParamsTypeError(Exception):
    def __init__(self, ErrorInfo):
        super().__init__(self)  # 初始化父类
        self.errorinfo = ErrorInfo

    def __str__(self):
        return self.errorinfo


# 使用装饰器来为斐波那契函数添加缓存
def cache_deco(func):
    cache = {}

    def wrap(*args):
        if args not in cache:
            cache[args] = func(*args)
        return cache[args]

    return wrap


@cache_deco
def fibo(n):
    try:
        n = int(n)
        if n < 2:
            return n
        return fibo(n - 1) + fibo(n - 2)
    except:
        raise ParamsTypeError('n must be int')


if __name__ == '__main__':
    fib_list = [i for i in map(fibo, range(10))]
    print(fib_list)



    """
        默写迭代器和生成器的概念
            迭代器: 在定义中是一个未知长度的数据流，通过next()函数来获取下一个元素
            生成器: 在定义中是一个特殊迭代器, 提供了惰性延迟的功能，通过在函数使用yield关键字体现
    """
